namespace CERT_OOP_CTOR_VIRTUAL_FUNC {

	namespace bad {
	
		struct A {
			void seize_mine();
			void seize_fun();
			A()
			{
				seize();
				seize_mine();
			}
			virtual ~A()
			{
				release();
				seize_fun();
			}
		protected:
			virtual void seize();
			virtual void release();
		};

		struct B : A {
			B() :A() {
				B::seize();
				B::release();
			}
		};

		struct base {
			base();
			virtual void f();
		};

		struct derived : base {
			derived() : base() {
				f();
			}
			void f() override final;
		};

		struct derived2 final : base {
			derived1() :base1() {
				f();
			}
			void f() override;
		};
	}
	
	namespace good {
		struct A {
			void seize_mine();
			void seize_fun();
			A()
			{
				seize_mine();
			}
			virtual ~A()
			{
				seize_fun();
			}
		protected:
			virtual void seize();
			virtual void release();
		};

		struct B : A {
			B() :A() {
				B::seize();
				B::release();
			}
		};

		struct base {
			base();
			virtual void f();
		};

		struct derived : base {
			derived() : base() {
				f();
			}
			void f() override final;
		};

		struct derived2 final : base {
			derived1() : base1() {
				f();
			}
			void f() override;
		};
	
	}


}